{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "BO7MEGbb6mtB"
   },
   "source": [
    "# Finetune RuGPTs in huggingface\n",
    "How to finetune RuGPTs models with huggingface. Example for RuGPT3Small. Nfor other models it will take more GPU memory.\n",
    "\n",
    "This notebook is valid for all RuGPTs models except RuGPT3XL.\n",
    "## Install env"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Xyhc5yrzR75j"
   },
   "outputs": [],
   "source": [
    "%%bash\n",
    "git clone https://github.com/huggingface/transformers\n",
    "cd transformers\n",
    "pip install ."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Os4vOL5LTOmk"
   },
   "outputs": [],
   "source": [
    "!pip install datasets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "m1P6WSIeTdV5"
   },
   "outputs": [],
   "source": [
    "!pip install evaluate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "WJZtWu8u6nwL"
   },
   "outputs": [],
   "source": [
    "!mkdir models/"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "WqwZiumW8WbZ"
   },
   "source": [
    "## Download files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "j51bKtQW6nyY"
   },
   "outputs": [],
   "source": [
    "!wget -O train.txt https://www.dropbox.com/s/oa3v9c7g9bp40xw/train.txt?dl=0\n",
    "!wget -O valid.txt https://www.dropbox.com/s/mworl3ld6r3bg62/valid.txt?dl=0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "zoyX62qN_38l"
   },
   "source": [
    "## Train \n",
    "The following code download our model and tokenizer from huggingface and finetune model for generating essays.\n",
    "\n",
    "This took aroung ten minutes and obtain perplexity = 13-16"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "SD6jS49-TAbM"
   },
   "outputs": [],
   "source": [
    "!wget https://raw.githubusercontent.com/huggingface/transformers/main/examples/pytorch/language-modeling/run_clm.py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "OCIERP8AS1Dl"
   },
   "outputs": [],
   "source": [
    "!python run_clm.py \\\n",
    "    --model_name_or_path sberbank-ai/rugpt3small_based_on_gpt2 \\\n",
    "    --train_file train.txt \\\n",
    "    --validation_file valid.txt \\\n",
    "    --per_device_train_batch_size 1 \\\n",
    "    --per_device_eval_batch_size 1 \\\n",
    "    --block_size 2048 \\\n",
    "    --dataset_config_name plain_text \\\n",
    "    --do_train \\\n",
    "    --do_eval \\\n",
    "    --output_dir models/essays"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "QvgntLymArg3"
   },
   "source": [
    "## Evaluate model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "id": "csHcDJXFDdaW"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "TJxPg-cJDhAB"
   },
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "torch.manual_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "id": "AkUrzKsy_16F"
   },
   "outputs": [],
   "source": [
    "from transformers import GPT2LMHeadModel, GPT2Tokenizer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "id": "x_EMbgO0BTvb"
   },
   "outputs": [],
   "source": [
    "tok = GPT2Tokenizer.from_pretrained(\"models/essays\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "id": "Fjy0GAuQBYpA"
   },
   "outputs": [],
   "source": [
    "model = GPT2LMHeadModel.from_pretrained(\"models/essays\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "irh4H-HDBb6V"
   },
   "outputs": [],
   "source": [
    "model.cuda()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "id": "hQY6A5q7Bd4O"
   },
   "outputs": [],
   "source": [
    "text = \"<s>Тема: «Создает человека природа, но развивает и образует его общество». (В.Т. Белинский)\\nСочинение: \"\n",
    "inpt = tok.encode(text, return_tensors=\"pt\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "1gfJFmeOBj_t"
   },
   "outputs": [],
   "source": [
    "out = model.generate(inpt.cuda(), max_length=500, repetition_penalty=5.0, do_sample=True, top_k=5, top_p=0.95, temperature=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 123
    },
    "id": "gWZ9SUCxB2Ki",
    "outputId": "31d8e1a3-376f-4f27-bd11-ba59a44983eb"
   },
   "outputs": [
    {
     "data": {
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "string"
      },
      "text/plain": [
       "'<s>Тема: «Создает человека природа, но развивает и образует его общество». (В.Т. Белинский)\\nСочинение:  В данном высказывании автор хотел сказать о том значении слова семья для общества в целом или отдельно от него.</S_T] - С одной стороны это выражение подчеркивает связь семьи с понятием воспитания; она выступает как важная составляющая формирования личности ребенка- гражданина России – члена общности людей по признаку принадлежности к той либо иной социальной группе(например родители воспитывают своих детей), а также дает представление об обществе на примерах из истории становления государства Российского до 1917 года.(Аплодисменты). Семья является важнейшим институтом социализации подрастающего поколения во всех сферах общественной жизни страныи оказывает большое влияние не только личностные характеристики членов данного круга отношений («родитель — ребенок»),но имеет важное социальное значение.[1173].Семья играет важную роль при осуществлении государством политики социального контроля над семьей путем изъятия у неё имущества путём продажи её другим лицам без согласия со стороной собственника.- Автор считает данную работу актуальной именно сегодня потому что мы находимся сейчас перед новым витком развития человеческого сообщества! Ведь если раньше человек был зависим лишь внешне друг ото друга… Сейчас же он может влиять практически всеми способами:- Через воспитание формируется личность,- через общение происходит формирование сознания гражданско правового поведения, посредством чего складывается общественное мнение.Таким образом можно ответить положительнона вопрос : \"Какое место занимает государство? Какое отношение оно проявляет ко всему обществу?\"Ответ зависит прежде всего ОТ того насколько серьезно отнесется данное высказывание Иезекиильян Амори • <a href=\"http://www210458785\" title=“История одного города” by Iceberger surname:\"Ampiree\", translation of the book “Old England”.» М., 1999 г.» \\n Я согласна полностью |Я думаю так будет всегда...И все таки я считаю семью самым важным социальным феноменом современности......Ведь дети растут здоровыми людьми..а значит они должны жить полноценной жизнью!!!Дарвин писал про то какое огромное воздействие оказывают социальные сети\\' твиты\\', когда речь шла исключительно обо мне самом....Но почему бы нам вместе создать сообщество единомышленников?! Может быть поэтому многие люди считают себя несчастными? Или дело вовсе ни здесь!? Мне кажется нет такого явления среди нас где любовь была б такой высокой любовью.....Любовь способна изменить жизнь любого существа независимо даже самого незначительного ее проявления!! Именно такие чувства являются подлинной ценностью нашей человеческой природы'"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tok.decode(out[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "1QY3mE2NXYIT"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "name": "RuGPT3FinetuneHF.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
